package net.bingosoft.common.util;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import net.bingosoft.common.data.BaseDao;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;

/**
 * 2008-3-24 下午03:52:58
 * Author:yangdongyu(yangdy@bingosoft.net)
 * ReadMe:属性的构建类
 * ChangeLog:
 */
public class TreeBuilder {
	private static final Log log = LogFactory.getLog(TreeBuilder.class);
	/**
	 * 通过一次查询,实现树的构建
	 * 我们只需要提供一条sql语句就可以生成一颗树
	 *  1.根据sql语句查询一个Map列表(这条查询语句查询的内容应该和Tree的属性对应,重点的属性包括 nodeId,parentNodeId,label,value等)
	 *  2.将Map中的数据注入到Tree对象中,每一个Entry将生成一个Tree节点
	 *  3.将Tree节点根据它的Id放入Map中,获得一个nodeId2NodeMap
	 *  4.遍历nodeId2NodeMap,根据tree的父节点(parentNodeId),从nodeId2NodeMap获取父节点,建立起树的层次关系
	 *  5.返回tree
	 * 
	 * @param dao BaseDao的实现
	 * @param sqlKey sql语句或sql语句在配置文件中的键值
	 * @param params sql查询语句的参数,非必要参数
	 * @return
	 */
	public static Tree buidTree(BaseDao dao,String sqlKey,Object... params){
		List<Tree> treeList =  dao.list(Tree.class, sqlKey, params);
		Tree firstNode = null;
		if(treeList.isEmpty()){
			log.debug("树节点列表为空,返回null");
			return null;
		}else{
			firstNode = treeList.get(0); 
		}
		Map<String, Tree> nodeId2NodeMap = new HashMap<String, Tree>(treeList.size());
		
		for(Tree node : treeList){
			nodeId2NodeMap.put(node.getNodeId(), node);
		}
		for(String nodeId : nodeId2NodeMap.keySet()){
			Tree node = nodeId2NodeMap.get(nodeId);
			if(node.getParentNodeId() != null){
				node.setParent(nodeId2NodeMap.get(node.getParentNodeId()));
			}
		}
		return firstNode.getRoot();
	}

}
